/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is the "Foxmon" extension for Firefox.
*
* The developer of the Original Code is Saravana Kumar.
*
* Portions created by the Initial Developer are 
* Copyright (C) 2006 the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*   Saravana Kumar <saravanannkl@gmail.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
* ***** END LICENSE BLOCK ***** */

/* Object for mozStorage functions.*/

var FoxmonStorageHelper = { 

	// Methods based on type values from mozIStorageValueArray
	outputParameterMethod : [ 
					"getUTF8String",// VALUE_TYPE_NULL = 0
					"getInt64", 	// VALUE_TYPE_INTEGER = 1
					"getDouble", 	// VALUE_TYPE_FLOAT = 2
					"getUTF8String",// VALUE_TYPE_TEXT =  3
					"getBlob" 	// VALUE_TYPE_BLOB = 4
				],

	// Contains the method for setting the input parameter. Indexed based on inputParameterType.
	inputParameterMethod : { 
					Null:       "bindNullParameter",   // For Null param
					Int32:      "bindInt32Parameter",  // For Int32 param
					Int64:      "bindInt64Parameter",  // For Int64 param
					Double:     "bindDoubleParameter", // For docuble/decimal/float param
					String:     "bindStringParameter", // For string param
					UTF8String: "bindUTF8StringParameter", // For UTF encoded string param
					Blob:       "bindBlobParameter"    // For Blob param
				},

	openConnection : function () {
			     var file = Components.classes["@mozilla.org/file/directory_service;1"]
					 .getService(Components.interfaces.nsIProperties)
					 .get("ProfD", Components.interfaces.nsIFile);
			     file.append("foxmon.sqlite");

			     var storageService = Components.classes["@mozilla.org/storage/service;1"]
					    .getService(Components.interfaces.mozIStorageService);
			     var mDBConn = storageService.openDatabase(file);
			     return mDBConn;
			},


	executeQuery : function (sqlQuery) {
				var con, stmt;
				try {
					con = this.openConnection();
					stmt = con.createStatement(sqlQuery);
					var resultDataSet = [];
					var colType;
					while(stmt.executeStep()) {
						if(!colType) {
							colType = [];
							for(var i = 0; i<stmt.columnCount; i++) {
								colType[colType.length] = this.outputParameterMethod[stmt.getTypeOfIndex(i)];
							}
						}

						var resultDataRow = [];
						for(var i=0; i<colType.length; i++) {
							resultDataRow[resultDataRow.length] = stmt[colType[i]](i);
						}

						resultDataSet[resultDataSet.length] = resultDataRow;
					}
					return resultDataSet;

				}
				catch(ex) {
					ex.message += "\r\n Error occurred while executing SQL " + sqlQuery;
					throw ex;
				}
				finally {
					if(stmt) stmt.reset();
					stmt = null;
					con = null;
				}
			},

	execute : function (sqlQuery, params) {
			var con, stmt;
			var i = 0;
			try {
				con = this.openConnection();
				stmt = con.createStatement(sqlQuery);
				if(params) {
					for(i=0; i<params.length; i++) {
						stmt[params[i][0]](i, params[i][1]);
					}
				}
				stmt.execute();
			}
			catch(ex) {
				ex.message += "\r\n Error occurred while executing SQL " + sqlQuery + " with params " + params + " for param " + i;
				throw ex;
			}
			finally {
				if(stmt) stmt.reset();
				stmt = null;
				con = null;
			}
		}
};